//
//  CoordinateSystemViewController.m
//  CoreAnimation
//
//  Created by 张国文 on 16/10/9.
//  Copyright © 2016年 hangzhouyijiyin. All rights reserved.
//

#import "CoordinateSystemViewController.h"

@interface CoordinateSystemViewController ()

@end

@implementation CoordinateSystemViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.view.backgroundColor = [UIColor whiteColor];
    // layer层的position、锚点
 //   [self layersPositionAndAnchorPoint];
    // 坐标的转化方法
//    [self userCoordinateChange];
    // zposition的使用
//    [self userZPositoin];
     // 使用geometryFlipped
    [self userGeometryFlipped];
}

// layer层的position、锚点
- (void)layersPositionAndAnchorPoint
{
    // 自己对锚点的认识：layer的锚点和position(图层的中心点)默认是重合的，锚点默认为(0.5,0.5)，不管锚点怎么改变，position都是不会改变的，因此锚点改变其实是将视图的新的锚点的位置重新定位到position上
    CALayer *layerOne = [[CALayer alloc] init];
    layerOne.frame = CGRectMake(100, 100, 100, 100);
    [self.view.layer addSublayer:layerOne];
    NSLog(@"layerOne的Position：%@", [NSValue valueWithCGPoint:layerOne.position]);
    NSLog(@"layerOne的anchorPoint: %@", [NSValue valueWithCGPoint:layerOne.position]);
}

// 坐标的转化方法
- (void)userCoordinateChange
{
    /**
     *  - (CGPoint)convertPoint:(CGPoint)point fromLayer:(CALayer *)layer;  // 将像素point由point所在视图转换到目标图层中，返回在目标视图图层中的像素值
     - (CGPoint)convertPoint:(CGPoint)point toLayer:(CALayer *)layer; // 将像素point从view中转换到当前图层中，返回在当前图层中的位置
     - (CGRect)convertRect:(CGRect)rect fromLayer:(CALayer *)layer;
     - (CGRect)convertRect:(CGRect)rect toLayer:(CALayer *)layer;
     */
    CALayer *blueLayer = [[CALayer alloc] init];
    blueLayer.frame = CGRectMake(100, 100, 100, 100);
    blueLayer.backgroundColor = [UIColor blueColor].CGColor;
    [self.view.layer addSublayer:blueLayer];
    CALayer *redLayer = [[CALayer alloc] init];
    redLayer.frame = CGRectMake(100, 300, 100, 100);
    redLayer.backgroundColor = [UIColor redColor].CGColor;
    [self.view.layer addSublayer:redLayer];
    
    // 打印blueLayer的position在view.layer中的像素
   
    NSLog(@"blueLayer的position在view.layer中的像素:%@",[NSValue valueWithCGPoint:[blueLayer convertPoint:blueLayer.position toLayer:self.view.layer]]);
    NSLog(@"或者使用这样的方法转换：%@", [NSValue valueWithCGPoint:[self.view.layer convertPoint:blueLayer.position fromLayer:blueLayer]]);
    
    // 打印view.layer.positoin在blueLayler中的位置
    NSLog(@"view.layer.positoin在blueLayler中的位置:%@", [NSValue valueWithCGPoint:[self.view.layer convertPoint:self.view.layer.position toLayer:blueLayer]]);
}

// 图层前后顺序zposition的使用
- (void)userZPositoin
{
    CALayer *blueLayer = [[CALayer alloc] init];
    blueLayer.frame = CGRectMake(100, 100, 100, 100);
    blueLayer.backgroundColor = [UIColor blueColor].CGColor;
    [self.view.layer addSublayer:blueLayer];
    CALayer *redLayer = [[CALayer alloc] init];
    redLayer.frame = CGRectMake(150, 150, 100, 100);
    redLayer.backgroundColor = [UIColor redColor].CGColor;
    [self.view.layer addSublayer:redLayer];
    
    // 改变zposition之前，redLayer应该在上面
    // 开始改变blueLayer的zposition，改变以后blueLayer应该在上面
    // 说明：zPosition默认值为0，越大说明越靠近屏幕，一般来增加一个像素就可以了。增加值其实并不需要增加太多，视图都非常地薄，所以给zPosition提高一个像素就可以让绿色视图前置，当然0.1或者0.0001也能够做到，但是最好不要这样，因为浮点类型四舍五入的计算可能会造成一些不便的麻烦。
    blueLayer.zPosition = 1.0f;
}

// 使用geometryFlipped
- (void)userGeometryFlipped
{
    // 官方解释：常规说来，在iOS上，一个图层的position位于父图层的左上角，但是在Mac OS上，通常是位于左下角。Core Animation可以通过geometryFlipped属性来适配这两种情况，它决定了一个图层的坐标是否相对于父图层垂直翻转，是一个BOOL类型。在iOS上通过设置它为YES意味着它的子图层将会被垂直翻转，也就是将会沿着底部排版而不是通常的顶部（它的所有子图层也同理，除非把它们的geometryFlipped属性也设为YES）
    // 自己得出的结论，self.view.layer的geometryFlipped为YES的情况下，相当于位于self.view.layer上的所有子视图坐标系都要翻转，因此想要在redLayer上采取OC下的坐标系的话，需要将redLayer的geometryFlipped也设为YES，相当于二次翻转。
    self.view.layer.geometryFlipped = YES; // 图层翻转变化为Mac OS上的坐标系
    CALayer *blueLayer = [[CALayer alloc] init];
    blueLayer.frame = CGRectMake(100, 100, 100, 100);
    blueLayer.backgroundColor = [UIColor blueColor].CGColor;
    [self.view.layer addSublayer:blueLayer];
    CALayer *redLayer = [[CALayer alloc] init];
    redLayer.frame = CGRectMake(150, 150, 100, 100);
    redLayer.backgroundColor = [UIColor redColor].CGColor;
    redLayer.geometryFlipped = YES; // 相当于二次翻转
    [self.view.layer addSublayer:redLayer];
    
    // 创建一个yellowLayer位于redLayer上
    CALayer *yellowLayer = [[CALayer alloc] init];
    yellowLayer.frame = CGRectMake(0, 0, 20, 20);
    yellowLayer.backgroundColor = [UIColor yellowColor].CGColor;
    [redLayer addSublayer:yellowLayer];
    
}

@end
